home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 061-070 / amok66 / diskindrive / diskindrive.mod < prev    next >
Text File  |  1993-11-04  |  4KB  |  167 lines

  1. (*************************************************************************
  2.  
  3. :Program.    DiskInDrive.mod
  4. :Contents.   Tests if a disk is inserted
  5. :Author.     Hartmut Goebel
  6. :Address.    Aufseßplatz 5, D-8500 Nürnberg 40
  7. :Copyright.  Copyright © 1990 by Hartmut Goebel
  8. :Language.   Oberon
  9. :Translator. Demo Oberon Compiler 1.17.1
  10. :History.    V1.0, 21.01.90, Modula-2
  11. :History.    V1.1, 14.07.90, ported to Oberon
  12. :History.    V1.2, 17.07.90, +Usage, error-messages
  13. :History.    V1.2b, 20 Mar 1991 cosmetics
  14. :History.    V1.2c, 21-Dec-91, ported to Oberon 2.13, removed SYSTEM [fbs]
  15. :Support.    ChangeState form M2-module TrackDiskSupport
  16.  
  17. :Usage.      DiskInDrive {DF0:|DF1:|DF2:|DF3:}
  18. :Usage.      Does not work from WorkBench
  19. :Usage.      returns Dos-Errorcode WARN, if no disk in specified drive
  20.  
  21. *************************************************************************)
  22.  
  23. MODULE DiskInDrive;
  24.  
  25. (* $OvflChk- $RangeChk- $StackChk- $NilChk- $ReturnChk- $CaseChk- *)
  26.  
  27. IMPORT
  28.   io,
  29.   e:  Exec,
  30.   es: ExecSupport,
  31.   ol: OberonLib,
  32.   td: TrackDisk;
  33.  
  34. VAR
  35.   in    : BOOLEAN;
  36.   adr   : LONGINT;
  37.   drive,err : INTEGER;
  38.   argument     : ARRAY 4 OF CHAR;
  39.   DiskPort     : e.MsgPortPtr;
  40.   DiskReqBlock : td.IOExtTDPtr;
  41.  
  42. (*------  Open TrackDisk:  ------*)
  43.  
  44. PROCEDURE OpenTrackDisk(device: INTEGER): INTEGER;
  45.  
  46. BEGIN
  47.   DiskPort := es.CreatePort("",0);
  48.   IF DiskPort = NIL THEN
  49.     io.WriteString("CreatePort failed\n");
  50.     HALT(10);
  51.   END;
  52. (*  Assert(DiskPort#NIL,ADR("CreatePort failed")); *)
  53.   DiskReqBlock := es.CreateExtIO(DiskPort,SIZE(DiskReqBlock^));
  54.   IF DiskReqBlock = NIL THEN
  55.     io.WriteString("CreateExtIO failed\n");
  56.     HALT(10);
  57.   END;
  58. (*  Assert(DiskReqBlock#NIL,ADR("CreateExtIO failed")); *)
  59.   adr:=e.OpenDevice(td.name,device,DiskReqBlock,
  60.                     LONGSET{td.allowNon35});
  61.   err := DiskReqBlock^.req.error;
  62.   IF err#0 THEN
  63.     es.DeleteExtIO(DiskReqBlock);
  64.     DiskReqBlock := NIL;
  65.     es.DeletePort(DiskPort);
  66.     DiskPort := NIL;
  67.   END;
  68.   RETURN err;
  69. END OpenTrackDisk;
  70.  
  71. (*------  Close TrackDisk:  ------*)
  72.  
  73. PROCEDURE CloseTrackDisk(device: INTEGER);
  74.  
  75. BEGIN
  76.   e.CloseDevice(DiskReqBlock);
  77.   es.DeleteExtIO(DiskReqBlock);
  78.   DiskReqBlock := NIL;
  79.   es.DeletePort(DiskPort);
  80.   DiskPort := NIL;
  81. END CloseTrackDisk;
  82.  
  83. (*------  Get Arguments -------*)
  84. (* Als das Prg entstand, hatte ich kein Modul Arguments für Oberon (wg.
  85.    Demo-Version. Aber so ist es eh kürzer!
  86. *)
  87. PROCEDURE GetArg (num:SHORTINT; VAR arg:ARRAY OF CHAR);
  88. VAR
  89.   i,j:INTEGER;
  90.   dcb : POINTER TO ARRAY 256 OF CHAR;
  91. BEGIN
  92.   dcb := ol.dosCmdBuf;
  93.   err := 0;
  94.   i := 0; j := 0;
  95.   REPEAT
  96.     INC(j,i);
  97.     i := 0;
  98.     REPEAT
  99.       INC(i);
  100.     UNTIL (i=4) OR (dcb[i+j]=0AX);
  101.     INC(err);
  102.   UNTIL err = num;
  103.   err := 0;
  104.   WHILE err < i DO
  105.     arg[err]:=dcb[err+j];
  106.     INC(err);
  107.   END;
  108.   arg[i]:=0X;
  109. END GetArg;
  110.  
  111. (*------  Is there a disk inserted?  ------*)
  112.  
  113. PROCEDURE ChangeState(device: INTEGER): BOOLEAN;
  114. (* returns TRUE if disk in drive *)
  115.  
  116. BEGIN
  117.   DiskReqBlock^.req.command := td.changeState;
  118.   IF e.DoIO(DiskReqBlock)=0 THEN END;
  119.   RETURN 0=DiskReqBlock^.req.actual;
  120. END ChangeState;
  121.  
  122. (*------ Is argument a disk device ? ------*)
  123.  
  124. PROCEDURE TestArg (str : ARRAY OF CHAR) : BOOLEAN;
  125. BEGIN
  126.  IF (LEN(str) = 4) AND (CAP(str[0])="D") AND (CAP(str[1])="F")
  127.  AND (str[3] =":") AND (str[2]<="4") AND ("0"<=str[2]) THEN
  128.    RETURN TRUE;
  129.  END;
  130.  RETURN FALSE;
  131. END TestArg;
  132.  
  133. (*--------------- main ------------------*)
  134.  
  135. BEGIN
  136. IF ol.wbStarted THEN
  137.   HALT(20);
  138. END;
  139. GetArg(1,argument);
  140. IF argument = "?" THEN
  141.   io.WriteString("DiskInDrive V1.2");io.WriteLn;
  142.   io.WriteString("Usage: DiskInDrive {DF0:|DF1:|DF2:|DF3:}\n");
  143. ELSIF TestArg(argument) THEN
  144.   drive := ORD(argument[2])-ORD("0");
  145.   err := OpenTrackDisk(drive);
  146.   IF err = 0 THEN
  147.     IF ChangeState(drive) THEN
  148.       CloseTrackDisk(drive);
  149.       io.WriteString("There is a disk in drive ");
  150.       io.WriteString(argument);io.WriteLn;
  151.     ELSE
  152.       CloseTrackDisk(drive);
  153.       io.WriteString("No disk in drive ");
  154.       io.WriteString(argument);io.WriteLn;
  155.       HALT(5);
  156.     END; (* ChangeState *)
  157.   ELSE (* err=0 *)
  158.    io.WriteString("Dos Error:");io.WriteInt(err,4);io.WriteLn;
  159.    HALT(10);
  160.   END; (* err=0 *)
  161. ELSE
  162.   io.WriteString("Bad Arg!\n");
  163.   HALT(10);
  164. END; (* IF TestArg *)
  165. END DiskInDrive.
  166.  
  167.